/**
  @file
  @author Stefan Frings
*/

#include "httpcookie.h"

using namespace qtwebapp;

HttpCookie::HttpCookie()
{
	version=1;
	maxAge=0;
	secure=false;
}

HttpCookie::HttpCookie(const QByteArray name, const QByteArray value, const int maxAge, const QByteArray path, const QByteArray comment, const QByteArray domain, const bool secure, const bool httpOnly)
{
	this->name=name;
	this->value=value;
	this->maxAge=maxAge;
	this->path=path;
	this->comment=comment;
	this->domain=domain;
	this->secure=secure;
	this->httpOnly=httpOnly;
	this->version=1;
}

HttpCookie::HttpCookie(const QByteArray source)
{
	version=1;
	maxAge=0;
	secure=false;
	QList<QByteArray> list=splitCSV(source);
	foreach(QByteArray part, list)
	{
		
		// Split the part into name and value
		QByteArray name;
		QByteArray value;
		int posi=part.indexOf('=');
		if (posi)
		{
			name=part.left(posi).trimmed();
			value=part.mid(posi+1).trimmed();
		}
		else
		{
			name=part.trimmed();
			value="";
		}
		
		// Set fields
		if (name=="Comment")
		{
			comment=value;
		}
		else if (name=="Domain")
		{
			domain=value;
		}
		else if (name=="Max-Age")
		{
			maxAge=value.toInt();
		}
		else if (name=="Path")
		{
			path=value;
		}
		else if (name=="Secure")
		{
			secure=true;
		}
		else if (name=="HttpOnly")
		{
			httpOnly=true;
		}
		else if (name=="Version")
		{
			version=value.toInt();
		}
		else if (this->name.isEmpty())
		{
			this->name=name;
			this->value=value;
		}
		else
		{
			qWarning("HttpCookie: Ignoring unknown %s=%s",name.data(),value.data());
		}
	}
}

QByteArray HttpCookie::toByteArray() const
{
	QByteArray buffer(name);
	buffer.append('=');
	buffer.append(value);
	if (!comment.isEmpty())
	{
		buffer.append("; Comment=");
		buffer.append(comment);
	}
	if (!domain.isEmpty())
	{
		buffer.append("; Domain=");
		buffer.append(domain);
	}
	if (maxAge!=0)
	{
		buffer.append("; Max-Age=");
		buffer.append(QByteArray::number(maxAge));
	}
	if (!path.isEmpty())
	{
		buffer.append("; Path=");
		buffer.append(path);
	}
	if (secure)
	{
		buffer.append("; Secure");
	}
	if (httpOnly)
	{
		buffer.append("; HttpOnly");
	}
	buffer.append("; Version=");
	buffer.append(QByteArray::number(version));
	return buffer;
}

void HttpCookie::setName(const QByteArray name)
{
	this->name=name;
}

void HttpCookie::setValue(const QByteArray value)
{
	this->value=value;
}

void HttpCookie::setComment(const QByteArray comment)
{
	this->comment=comment;
}

void HttpCookie::setDomain(const QByteArray domain)
{
	this->domain=domain;
}

void HttpCookie::setMaxAge(const int maxAge)
{
	this->maxAge=maxAge;
}

void HttpCookie::setPath(const QByteArray path)
{
	this->path=path;
}

void HttpCookie::setSecure(const bool secure)
{
	this->secure=secure;
}

void HttpCookie::setHttpOnly(const bool httpOnly)
{
	this->httpOnly=httpOnly;
}

QByteArray HttpCookie::getName() const
{
	return name;
}

QByteArray HttpCookie::getValue() const
{
	return value;
}

QByteArray HttpCookie::getComment() const
{
	return comment;
}

QByteArray HttpCookie::getDomain() const
{
	return domain;
}

int HttpCookie::getMaxAge() const
{
	return maxAge;
}

QByteArray HttpCookie::getPath() const
{
	return path;
}

bool HttpCookie::getSecure() const
{
	return secure;
}

bool HttpCookie::getHttpOnly() const
{
	return httpOnly;
}

int HttpCookie::getVersion() const
{
	return version;
}

QList<QByteArray> HttpCookie::splitCSV(const QByteArray source)
{
	bool inString=false;
	QList<QByteArray> list;
	QByteArray buffer;
	for (int i=0; i<source.size(); ++i)
	{
		char c=source.at(i);
		if (inString==false)
		{
			if (c=='\"')
			{
				inString=true;
			}
			else if (c==';')
			{
				QByteArray trimmed=buffer.trimmed();
				if (!trimmed.isEmpty())
				{
					list.append(trimmed);
				}
				buffer.clear();
			}
			else
			{
				buffer.append(c);
			}
		}
		else if (c=='\"')
		{
			inString=false;
		}
		else
		{
			buffer.append(c);
		}
	}
	QByteArray trimmed=buffer.trimmed();
	if (!trimmed.isEmpty())
	{
		list.append(trimmed);
	}
	return list;
}
